import hashlib
import time

from flask_login import UserMixin

from db import db


class Account(db.Model):
    """
    用户账号
    """
    __tablename__ = 'account'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.Text)  # 用户名
    password = db.Column(db.Text)  # 密码
    create_time = db.Column(db.Integer, default=time.time)
    last_login_time = db.Column(db.Integer)
    last_login_ip = db.Column(db.Text)


class Player(db.Model, UserMixin):
    """
    用户
    """
    __tablename__ = 'player'

    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.Text)  # 昵称
    gender = db.Column(db.Text)  # 性别 男，女
    account_id = db.Column(db.Integer)  # 账号id
    level = db.Column(db.Integer)  # 等级
    hp = db.Column(db.Integer)  # 气血
    mp = db.Column(db.Integer)  # 精气
    atk = db.Column(db.Integer)  # 伤害
    ac = db.Column(db.Integer)  # 防御
    speed = db.Column(db.Integer)  # 速度
    hit = db.Column(db.Integer)  # 命中
    dodge = db.Column(db.Integer)  # 闪避
    crit = db.Column(db.Integer)  # 暴击
    rcrit = db.Column(db.Integer)  # 抗暴击
    counter = db.Column(db.Integer)  # 反击
    rcounter = db.Column(db.Integer)  # 抗反击
    leech = db.Column(db.Integer)  # 吸血，单位百分之0.01
    atk_level = db.Column(db.Integer)  # 攻击修炼等级
    ac_level = db.Column(db.Integer)  # 防御修炼等级
    equip_1 = db.Column(db.Integer)  # 帽子
    equip_2 = db.Column(db.Integer)  # 项链
    equip_3 = db.Column(db.Integer)  # 武器
    equip_4 = db.Column(db.Integer)  # 衣服
    equip_5 = db.Column(db.Integer)  # 腰带
    equip_6 = db.Column(db.Integer)  # 鞋子
    exp = db.Column(db.Integer)  # 当前经验
    money = db.Column(db.Integer)  # 金钱
    create_time = db.Column(db.Integer, default=time.time)


class UserToken(db.Model):
    """
    用户登录鉴权的token，放在头部
    """
    __tablename__ = 'user_token'

    id = db.Column(db.Integer, primary_key=True)
    token = db.Column(db.String(32), unique=True)  # 鉴权token
    player_id = db.Column(db.Integer, nullable=False, unique=True)  # 玩家id
    expires = db.Column(db.Integer)  # Token到期时间

    @classmethod
    def get_player(cls, token):
        """
        通过token获取Player
        """
        token = cls.query.filter(cls.token == token, cls.expires <= time.time()).scalar()
        if not token:
            return None
        user = Player.query.filter(Player.id == token.user_id).scalar()
        return user


class Item(db.Model):
    """
    用户登录鉴权的token，放在头部
    """
    __tablename__ = 'item'

    id = db.Column(db.Integer, primary_key=True)
    player_id = db.Column(db.Integer)  # 玩家id
    item_type = db.Column(db.Integer)  # 物品类型
    name = db.Column(db.Text)  # 物品名称
    description = db.Column(db.Text)  # 物品描述
    data = db.Column(db.Text)  # 物品详细数据（json）
    create_time = db.Column(db.Integer, default=time.time)
    visible = db.Column(db.Boolean, default=True)  # 是否可见
